#ifndef symbol_compil_h
#define symbol_compil_h

#include "Value.hpp"
#include "Expression.hpp"

class Symbol {
	protected:
		typedef enum {
			SYMBOL_PROGRAM = 100, 
			SYMBOL_TYPE, 
			SYMBOL_CONST, 
			SYMBOL_PROC, 
			SYMBOL_FUNCT
		} SymbolID;


		Type * t;
		int symbolId;

	public:
		virtual ~Symbol(){};
		bool hasValue();
		Value * getValue();
		virtual bool hasExpression();
		virtual Expression * getExpression();
		Type * getType();
		void setType(Type * newType);
		bool hasType();
		virtual void show();
		int getId() {return symbolId;};


		virtual Symbol * clone(){return NULL;};
		virtual bool operator==(Symbol & toCompare ) {
			return this->getId() == toCompare.getId();
		}

		virtual bool operator!=(Symbol & toCompare ) {
			return !( *this == toCompare );
		}

};

#endif
